Use case: DCACHE maintenance operations in interrupt mode

Sequence diagram

DCACHE maintenance operations in interrupt mode.

  @startuml
  participant "User\nApplication" as UA
  participant "DCACHE\nDriver" as DD
  participant "DCACHE_IRQHandler" as IRQ

  skinparam sequenceMessageAlign center

  == DCACHE Initialization ==
  |||
  opt
      UA ->  DD : **HAL_DCACHE_RegisterCallback**(&hdcache, HAL_DCACHE_CLEAN_BY_ADDRESS_CB_ID, USER_DCACHE_InvalidateCompleteCallback)\n**HAL_DCACHE_RegisterCallback**(&hdcache, HAL_DCACHE_CLEAN_BY_ADDRESS_CB_ID, USER_DCACHE_CleanByAddrCallback)\n**HAL_DCACHE_RegisterCallback**(&hdcache, HAL_DCACHE_INVALIDATE_BY_ADDRESS_CB_ID, USER_DCACHE_InvalidateByAddrCallback)\n**HAL_DCACHE_RegisterCallback**(&hdcache, HAL_DCACHE_CLEAN_AND_INVALIDATE_BY_ADDRESS_CB_ID, USER_DCACHE_CleanAndInvalidateByAddrCallback)
      DD --> UA : return HAL_OK
  end
  |||
  UA->DD : **HAL_DCACHE_Enable**
  DD --> UA : return HAL_OK
  UA -> DD : **__HAL_DCACHE_ENABLE_IT**
  note right : Choose to enable Eviction Clean error interrupt
  |||
  UA -> DD : **HAL_DCACHE_CleanByAddr_IT**,\n**...**\n**HAL_DCACHE_InvalidateByAddr_IT**,\n**...**\n**HAL_DCACHE_CleanInvalidByAddr_IT**,\n**...**\n**HAL_DCACHE_Invalidate_IT**,\n**...**
  rnote over DD
  Flag Command Interrupt (CMDENDIE) enabled or
      Flag Invalidate Interrupt (BSYENDIE) enabled
  endrnote
  DD --> UA : return HAL_OK or HAL_ERROR
  |||
  == Interruption Service Routine ==
  |||
  IRQ <- : DCACHE Maintenance interrupt
  IRQ -> DD : **HAL_DCACHE_IRQHandler**
  note left : Interruption execution\nDisable BSYEND or CMDEND interrupt
  alt USE_HAL_DCACHE_REGISTER_CALLBACKS
      DD -> UA : **USER_DCACHE_InvalidateCompleteCallback**\n**USER_DCACHE_CleanByAddrCallback**\n**USER_DCACHE_InvalidateByAddrCallback**\n**USER_DCACHE_CleanAndInvalidateByAddrCallback**
      DD <-- UA
  else USE OVERRIDDEN WEAK CALLBACKS
      DD -> UA : **HAL_DCACHE_InvalidateCompleteCallback**\n**HAL_DCACHE_CleanByAddrCallback**\n**HAL_DCACHE_InvalidateByAddrCallback**\n**HAL_DCACHE_CleanAndInvalidateByAddrCallback**
      DD <-- UA
  end
  |||
  @enduml

Code snippet

HAL1

HAL2

/* Optional: register callbacks */
HAL_DCACHE_RegisterCallback(&hdcache, HAL_DCACHE_CLEAN_BY_ADDRESS_CB_ID,
                            USER_DCACHE_CleanByAddrCallback);
HAL_DCACHE_RegisterCallback(&hdcache, HAL_DCACHE_INVALIDATE_BY_ADDRESS_CB_ID,
                            USER_DCACHE_InvalidateByAddrCallback);

HAL_DCACHE_Enable(&hdcache);
__HAL_DCACHE_ENABLE_IT(&hdcache, DCACHE_IT_CMDEND | DCACHE_IT_BSYEND | DCACHE_IT_ERR);

/* Trigger maintenance operations in interrupt mode */
HAL_DCACHE_CleanByAddr_IT(&hdcache, (uint32_t *)buffer, buffer_size);

/* In IRQ handler */
void DCACHE_IRQHandler(void)
{
  HAL_DCACHE_IRQHandler(&hdcache);
}
/* Optional: register callbacks */
HAL_DCACHE_RegisterCleanByAddrCallback(myDCACHE_CleanByAddrCallback);
HAL_DCACHE_RegisterInvalidateByAddrCallback(myDCACHE_InvalidateByAddrCallback);

/* Start DCACHE with error interrupt enabled */
HAL_DCACHE_Start(&hdcache, HAL_DCACHE_IT_ERROR);

/* Trigger maintenance operations in interrupt mode */
HAL_DCACHE_CleanByAddr_IT(&hdcache, (uint32_t *)buffer, buffer_size);

/* In IRQ handler */
void DCACHE_IRQHandler(void)
{
  HAL_DCACHE_IRQHandler(&hdcache);
}

Key changes

  1. HAL2 provides dedicated callback registration APIs instead of using callback IDs.

  2. HAL2 uses HAL_DCACHE_Start() to enable the peripheral and interrupts.

  3. The IRQ handler entry point remains HAL_DCACHE_IRQHandler().